home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
mcu
/
float09.arc
/
MVABSNEG.SA
< prev
next >
Wrap
Text File
|
1987-03-04
|
7KB
|
290 lines
NAM MOVE
TTL FMOVE FUNCTION
*
* LINKING LOADER DEFINITIONS
*
XDEF FMOVE,MOVUN,FABS,FNEG
*
XREF CLRES,FPMOVE,CLTBL,CHKUNF,CHKOVF,ADBIAS,SUBIAS
XREF UNFLNT,OVFLNT,CKINVD,ROUND,IOPSUB,ISDNRM,RTAR2
*
* REVISION HISTORY:
* DATE PROGRAMMER REASON
* 30.MAY.80 G. STEVENS ORIGINAL
* 07.JUL.80 G. STEVENS FIX MOVE FCN.
* 07.AUG.80 G. STEVENS FIX NEG FCN( MAKE IT REALLY NEG)
* 08.AUG.80 G. STEVENS FIX CONTROL FLOW IN MOVUN
* 11.AUG.80 G. STEVENS SET UP RPREC IN FMOVE
* 13.AUG.80 G. STEVENS REMOVE SET RPREC IN MOVE
* 14.AUG.80 G. STEVENS UNMOVE HANDLES DENORMALIZED PROPERLY
* 14.AUG.80 G. STEVENS REMOVE ANY SIZE CHECKS IN FMOVE
* 18.AUG.80 G. STEVENS ABS & NEG INVOKE RTAR2 SOLVING UNFL PROBB.B
*
PAGE
*
* LOCAL EQUATE
*
DSTSIZ EQU BIT0+BIT1+BIT2
*
*
* HERE IS THE TWO ROUTINE THAT MAKE UP THE MOVE
* MOVE FUNCTION. PROCEDURE A HANDLES MOVES WHEN
* THE OPERANDS ARE BOTH NORMALIZED. PROCEDURE B
* HANDLES THE CASE WHERE THE OPERANDS ARE UNORMALIZED
*
******************************************************************
*
* PROCEDURE B:
*
* PROCEDURE UNMOVE
*
* UNMOVE CONVERTS AN UNNORMALIZED FLOATING OPERAND
* ON THE STACK FRAME FROM ONE PRECISION TO ANOTHER. THE
* PRECISIONS OF THE SOURCE AND DESTINATION ARE CONTAINED
* IN THE TPARAM LOCATION ON THE STACK FRAME.
*
* ON ENTRY:
* ARG2 CONTAINS THE INPUT ARGUMENT
*
* ON EXIT:
* RESULT CONTAINS THE CONVERTED VALUE
* U - UNCHANGED
* D,X,Y,CC - DESTROYED
*
MOVUN EQU *
*
* COMPARE SIZE OF SOURCE AND SIZE OF DESTINATION
*
LDB TPARAM+1,U SIZE WORD
LDA #16
MUL
LDB TPARAM+1,U
ANDB #07 DESTINATION SIZE IN B
*
* IF THE MOVE IS SINGLE TO DOUBLE THEN SIGNAL INVALID
* OPERATION IOP = 15.
*
IF D,EQ,#(SIN/2*256+DBL/2)
IOP 15
*
*
* ELSE IF THE MOVE IS FROM EXTENDED TO SINGLE OR DOUBLE
* ANS THE ARGUMENT IS NOT DENORMALIZED THEN SIGNAL INVALID
* OPERATION IOP = 16.
*
ELSE
IF A,GE,#(EXT/2) SOURCE = SINGLE
IF B,LT,#(EXT/2) DESTINATION = DOUBLE
LEAX ARG2,U
LSLA DOUBLE SOURCE INDEX
LBSR ISDNRM CHECK FOR DENORMALIZED
IFCC NE NOT DENORMALIZED
IOP 16
*
BRA RET RETURN
*
ENDIF
ENDIF
ENDIF
*
*
* ELSE IF NONE OF THE ABOVE INVOKE THE REGULAR MOVE
* PROCEDURE.
*
BSR FMOVE
*
ENDIF
*
RET EQU *
*
RTS RETURN
*
PAGE
*
* PROCEDURE A: OPERANDS NORMALIZED
*
* PROCEDURE AFMOVE
*
* AFMOVE VONVERTS NORMALIZED FLOATING OPERANDS
* ON THE STACK FRAME FROM ONE PRECISION TO ANOTHER
* THE PRECISIONS OF THE SOURCE AND DESTINATION ARE
* CONTAINED IN THE TPARAM+1 LOCATION ON THE STACK
* FRAME. IF THE PRECISION OF THE SOURCE AND DESTINATION
* ARE THE SAME THEN NO STACK FRAME IS BUILT SINCE NO REAL
* CONVERSION IS NECESSARY.
*
* ON ENTRY:
* ARG2 CONTAINS THE INPUT ARGUMENT
* U - CONTAINS THE POINTER TO THE STACK FRAME
*
* ON EXIT:
* RESULT CONTAINS THE CONVERTED VALUE
* U - UNCHANGED
* A,B,X,Y,CC - DESTROYED
*
FMOVE EQU *
*
*
* MOVE INPUT ARGUMENT( ARG2 ) TO THE STACK FRAME RESULT
*
LEAX ARG2,U INPUT ARGUMENT
LEAY RESULT,U DESTINATION
LBSR FPMOVE
*
* IF THE DESTINATION IS SHORTER THAN THE SOURCE THEN
* ROUNDING AND OVERFLOW/UNDERFLOW CHECKS MUST BE PERFORMED
*
LDA TPARAM+1,U SIZE BYTE
ANDA #DSTSIZ DESTINATION SIZE
*
* OR BYTES BEYOND THE PRECISION OF DEST. INTO THE STICKY
* BYTE
*
LEAY CLTBL,PCR
LDB A,Y POSITON OF G- BYTE
INCB BUMP POINTER PAST G-BYTE
CLRA
WHILE B,LT,(#ARGSIZ-1)
ORA B,X OR THE BYTES
INCB
*
ENDWH
STA STIKY,U SET UP STIKY
*
LBSR CHKUNF CHECK FOR UNDERFLOW
*
* IF UNDERFLOW = TRUE AND THE TRAP IS ENABLED THEN DELIVER
* THE RESULT IN INTERNAL FORMAT ROUNDED TO THE PRECISON
* OF THE DESTINTION TO THE TRAP HANDLER.
*
IFCC EQ UNDERFLOW = TRUE
LDX PFPCB,U POINTER TO FPCB
LDA ENB,X ENABLE BYTE
ANDA #ENBUNF UNDERFLOW TRAP ENABLE
IFCC NE TRAP ENABLED
LEAX RESULT,U
LBSR ADBIAS WRAP AROUND EXPONENT
LBSR ROUND ROUND RESULT
*
* ELSE IF UNDERFLOW = TRUE BUT TRAP IS DISABLED THEN
* UNDERFLOW_NO_TRAP.
*
ELSE TRAP DISABLED
LBSR UNFLNT
*
ENDIF
*
* ELSE IF UNDERFLOW /= TRUE THEN JUST ROUND RESULT
* TO THE PRECISION OF THE DESTINATION
*
ELSE UNDERFLOW /= TRUE
LEAX RESULT,U
LBSR ROUND ROUND RESULT
*
ENDIF UNDERFLOW = TRUE
*
* POST ROUND CHECKS
*
LBSR CKINVD CHECK FOR INVALID OPERATION
*
LBSR CHKOVF
*
* IF OVERFLOW = TRUE AND TRAP IS ENABLED THEN DELIVER THE
* RESULT IN INTERNAL FORMAT ROUNDED TO THE PRECISION OF
* THE DESTINATION.
*
IFCC EQ OVERFLOW = TRUE
LDX PFPCB,U POINTER TO FPCB
LDA ENB,X ENABLE BYTE
ANDA #ENBOVF OVERFLOW TRAP ENABLE
IFCC NE TRAP ENABLED
LBSR SUBIAS
*
* ELSE IF OVERFLOW = TRUE BUT TRAP IS DISABLED THEN
* INVOKE OVERFLOW_NO_TRAP.
*
ELSE TRAP DISABLED
LBSR OVFLNT
*
ENDIF TRAP ENABLED
*
ENDIF OVERFLOW = TRUE
*
* ELSE IF THE DESTINATION IS LARGER THEN THE SOURCE THEN
* THE MOVE IS EXACT.
*
*
*
RTS RETURN
*
*
*
*****************************************************************
*
* ABSOLUTE VALUE AND NEGATE FUNCTIONS
*
******************************************************************
*
* PROCEDURE FABS
*
* FABS RETURNS AS ITS RESULT THE ABSOLUTE VALUE
* OF THE FLOATING PT. VALUE IN ARG2 ON THE STACK FRAME.
*
* ON ENTRY: ARG2 CONTAINS INPUT ARGUMENT
* U - POINTER TO THE STACK FRAME
*
* ON EXIT: RESULT CONTAINS THE ABSOLUTE VALUE OF THE INPUT
* U - UNCHANGED
* X,Y,D,CC - DESTROYED
*
* OPERATION:
* THE INPUT IS COPIED TO THE RESULT AND THE SIGN OF THE
* RESULT IS SET TO $00 OR PLUS.
*
*
FABS EQU *
*
LBSR RTAR2 MOVE ARG2 TO THE RESULT
*
* MAKE SIGN POSITIVE
*
CLR SIGNR,U
*
RTS RETURN
*
*
*****************************************************************
*
*
* PROCEDURE FNEG
*
* FNEG RETURNS AS ITS RESULT THE NEGATIVE
* OF THE FLOATING PT. VALUE IN ARG2 ON THE STACK FRAME.
*
* ON ENTRY: ARG2 CONTAINS INPUT ARGUMENT
* U - POINTER TO THE STACK FRAME
*
* ON EXIT: RESULT CONTAINS THE ABSOLUTE VALUE OF THE INPUT
* U - UNCHANGED
* X,Y,D,CC - DESTROYED
*
* OPERATION:
* THE INPUT IS COPIED TO THE RESULT AND THE SIGN OF THE
* RESULT IS COMPLEMENTED.
*
*
FNEG EQU *
*
LBSR RTAR2 RETURN ARG2 IN THE RESULT
*
* COMPLEMENT THE SIGN
*
LDA SIGNR,U
EORA #$80
STA SIGNR,U
*
RTS RETURN
*
*
PAGE